
// Promise
// 1、对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态。这也是Promise这个名字的由来，它的英语意思就是“承诺”，表示其他手段无法改变。
// 2、一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）。如果改变已经发生了，你再对Promise对象添加回调函数，也会立即得到这个结果。这与事件（Event）完全不同，事件的特点是，如果你错过了它，再去监听，是得不到结果的。


// let handler = setTimeout(() => {
//     console.log('1s 后执行打印操作')
//     setTimeout(() => {
//         console.log('2s 后执行打印操作')
//         setTimeout(() => {
//             console.log('3s 后执行打印操作')
//         }, 3000);
//     }, 2000);
// }, 1000);

// const p = new Promise(function(resolve, reject) {
//     setTimeout(() => {
//         resolve('1s error')
//     }, 1000);
// })

// p.then(function(res) {
//     console.log(res)
// }, function(errors) {
//     console.log(errors)
// })


// es7 async/await  async 函数是Generator 函数的语法糖。
// 协程  多线程  多进程
// npm 工具 是nodejs 的包管理工具
// 别人写好的功能模块，用npm 直接拿来用。


const fs = require('fs');

const readFile = function (fileName) {
    return new Promise(function(resolve, reject) {
        fs.readFile(fileName, function(error, data) {
            if (error) {
                return reject(error);
            }
            resolve(data)
        }) 
    })
}

// readFile('/Users/apple/tina/www/e2019/layastudy/ts/es6/test.txt').then(
//     data => console.log('test.txt:', data)
// ).then(function() {
//     readFile('/Users/apple/tina/www/e2019/layastudy/ts/es6/test2.txt').then(
//         data => console.log('test1.txt:', data)
//     )
// }).then(function() {
//     readFile('/Users/apple/tina/www/e2019/layastudy/ts/es6/test3.txt').then(
//         data => console.log('test3.txt:', data)
//     )
// })

const asyncReadFile = async function() {
    const f1 = await readFile('/Users/apple/tina/www/e2019/layastudy/ts/es6/test.txt')
    console.log(f1.toString());
    const f2 = await readFile('/Users/apple/tina/www/e2019/layastudy/ts/es6/test2.txt')
    console.log(f2.toString());
    const f3 = await readFile('/Users/apple/tina/www/e2019/layastudy/ts/es6/test3.txt')
    console.log(f3.toString());
}

asyncReadFile();


